package com.util;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Desc:
 *
 * @author wujw
 * @email jiwenwu@outlook.com
 * @date 2019-01-08
 */
public class MathUtils {
    //防止实例化
    private MathUtils(){

    }
    /**
     * 精确的减法运算
     * @param v1 被减数
     * @param v2 减数
     * @return 差
     */
    public static double subDecimal(double v1,double v2){

        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));

        return b1.subtract(b2).doubleValue();
    }
    /**
     * 精确的加法运算
     * @param v1
     * @param v2
     * @return 和
     */
    public static double addDecimal(double v1,double v2){

        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));

        return b1.add(b2).doubleValue();
    }
    /**
     * 精确的除法运算，当发生除不尽时，保留小数点后几位四舍五入
     * @param v1 被除数
     * @param v2 除数
     * @param scale 保留位数
     * @return 商
     */
    public static double divDecimal(double v1,double v2,int scale){
        if(scale < 0){
            throw new IllegalArgumentException("保留位数必须是一个大于等于0的整数！");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();

    }

    /**
     * 在一个数组中随机抽取一组
     * @param arr
     * @param n  需要抽取的个数
     * @return  随机抽取的数据
     */
    public static Object[] createRandomArray(Object[] arr, int n) {
        Map<Integer,Object> map = new HashMap<Integer,Object>();
        Object[] arrNew = new Object[n];
        if(arr.length<=n){
            return arr;
        }else{
            int count = 0;//新数组下标计数
            while(map.size()<n){
                int random = (int) (Math.random() * arr.length);
                if (!map.containsKey(random)) {
                    map.put(random, "");
                    System.out.println(random+"==========="+arr[random]);
                    arrNew[count++] = arr[random];
                }
            }
            return arrNew;
        }
    }

    /**
     * 从list中随机抽取元素
     * @param list
     * @param n  抽取的个数
     * @return  抽取出来的新list
     */
    public static List<Object> createRandomList(List<Object> list, int n) {
        Map<Integer,Object> map = new HashMap<Integer,Object>();
        List<Object> listNew = new ArrayList<Object>();
        if(list.size()<=n){
            return list;
        }else{
            while(map.size()<n){
                int random = (int) (Math.random() * list.size());
                if (!map.containsKey(random)) {
                    map.put(random, "");
                    System.out.println(random+"==========="+list.get(random));
                    listNew.add(list.get(random));
                }
            }
            return listNew;
        }
    }

}
